package com.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("/file")
public class FileController {

    //定义文件上传的目标路径
    public final String DESTPATH = "D://file/";

    @RequestMapping("/uploadPage")
    public String intoUploadPage(String flag){
        String page = "";
        if(flag.equals("s")){
            page = "fileUploadSingle";
        } else if (flag.equals("m")) {
            page = "fileUploadMore";
        }
        return page;
    }

    /**
     * 上传文件
     * @param file
     *      表示准备要上传的文件
     *      形参名与jsp页面中的name属性保持一致
     *      由于页面中的input标签是file类型，所以形参需要使用MultipartFile定义
     * @return
     */
    @RequestMapping("/uploadSingle")
    public String uploadFileSingle(MultipartFile file) throws IOException {

        //1.处理原始文件的文件名
        //  1) 原文件名保持不变，问题是中文容易出现乱码
        //  2) 把原文件名用一些随机数进行替换


        //1.1 获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();

        //1.2 获取上传文件的扩展名
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));

        //1.3 用当前时间的时间戳+扩展名作为新文件名
        String fileNameNew = System.currentTimeMillis()+fileType;

        //2.定义原始文件要上传到的目标路径(此路径必须已经存在)
//        String destPath = "D://file/";

        //3.把原始文件上传到目标路径下
        file.transferTo(new File(DESTPATH+fileNameNew));

        return "fileUploadSingle";
    }

    /**
     *
     * @param files 必须与页面中的input标签的name属性保持一致
     * @return
     */
    @RequestMapping("/uploadMore")
    public String uploadFileMore(MultipartFile[] files) throws IOException {

        //遍历所有需要上传的文件
        for (MultipartFile file : files) {
            //每个文件分别上传，采取了不改变原文件名的方式上传
            file.transferTo(new File(DESTPATH+file.getOriginalFilename()));
        }

        return "fileUploadMore";
    }


    @RequestMapping("/downloadPage")
    public String intoDownloadPage(){
        return "fileDownload";
    }

    @RequestMapping("/download")
    public ResponseEntity<byte[]> downloadFile(String fileName) throws IOException {

        //1.把需要下载的文件变成字节数组的形式
        byte[] fileBytes = FileUtils.readFileToByteArray(new File(DESTPATH+fileName));

        //2.创建 MultiValueMap<String, String> 接口的实现类的实例化对象
        HttpHeaders headers = new HttpHeaders();
        //设置下载的方式 attachment 直接下载   inline 在线打开
        headers.setContentDispositionFormData("inline",fileName);

        //3.设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;

        return new ResponseEntity<byte[]>(fileBytes,headers,statusCode);

    }

}
